#include <bits/stdc++.h>

#define lbt(x) (x&(-x))

using namespace std;

const int N=1e5+5;

int n,m1,m2,Ans;

struct Data {
	int l,r;
	bool operator<(const Data &x) const {
		return l<x.l;
	}
}p1[N],p2[N];

struct BIT {
	int n,T[N];
	
	void Add(int x,int y) {
		for (int i=x;i<=n;i+=lbt(i)) T[i]+=y;
	}
	
	int Qry(int x) {
		int Sum=0;
		for (int i=x;i;i-=lbt(i)) Sum+=T[i];
		return Sum;
	}
}T1,T2;

struct UIT {
	int n,c[N],v[N];
	
	void Add(int x,int y) {
		if (!x) {
			v[0]+=y,c[0]++;
			return;
		}
		for (int i=x;i<=n;i+=lbt(i)) c[i]++,v[i]+=y;
	}
	
	int Qryc(int x) {
		if (x<0) return 0;
		int sc=c[0];
		for (int i=x;i;i-=lbt(i)) sc+=c[i];
		return sc;
	}
	
	int Qryv(int x) {
		if (x<0) return 0;
		int sv=v[0];
		for (int i=x;i;i-=lbt(i)) sv+=v[i];
		return sv;
	}
	
	int Qry(int x,int u) {
		return Qryc(x)*u-Qryv(x);
	}
}U1,U2;

int main() {
	freopen("airport.in","r",stdin);
	freopen("airport.out","w",stdout);
	
	scanf("%d%d%d",&n,&m1,&m2);
	for (int i=1;i<=m1;i++) scanf("%d%d",&p1[i].l,&p1[i].r);
	for (int i=1;i<=m2;i++) scanf("%d%d",&p2[i].l,&p2[i].r);
	
	sort(p1+1,p1+m1+1),sort(p2+1,p2+m2+1);
	
	int t=0,now=0;
	deque<Data> q;
	q.clear();
	
	T1.n=m1,T2.n=m2;
	U1.n=m1,U2.n=m2;
	
	for (int i=1;i<=m1;i++) {
		if (p1[i].l<=t) {
			if (q.back().r<p1[i].l) {
				T1.Add(q.size(),now);
				U1.Add(q.size()-now,q.size()-now);
				while (p1[i].l>q.back().r) q.pop_back();
				now=0;
			}
			else if (q.front().r<p1[i].l) {
				T1.Add(q.size(),now);
				U1.Add(q.size()-now,q.size()-now);
				while (q.front().r<p1[i].l) q.pop_front();
				now=0;
			}
			q.push_back(p1[i]),now++,t=max(t,p1[i].r);
		}
		else {
			q.clear();
			now=1,t=p1[i].r;
			q.push_back(p1[i]);
		}
	}
	
	T1.Add(q.size(),now);
	U1.Add(q.size()-now,q.size()-now);
	
	t=now=0,q.clear();
	
	for (int i=1;i<=m2;i++) {
		if (p2[i].l<=t) {
			if (q.back().r<p2[i].l) {
				T2.Add(q.size(),now);
				U2.Add(q.size()-now,q.size()-now);
				while (p2[i].l>q.back().r) q.pop_back();
				now=0;
			}
			else {
				T2.Add(q.size(),now);
				U2.Add(q.size()-now,q.size()-now);
				while (q.front().r<p2[i].l) q.pop_front();
				now=0;
			}
			q.push_back(p2[i]),now++,t=max(t,p2[i].r);
		}
		else {
			q.clear();
			now=1,t=p2[i].r;
			q.push_back(p2[i]);
		}
	}
	
	T2.Add(q.size(),now);
	U2.Add(q.size()-now,q.size()-now);
	
	for (int i=0;i<=n;i++) {
		Ans=max(Ans,T1.Qry(i)+U1.Qry(i,i)+T2.Qry(m2-i)+U2.Qry(m2-i,m2-i));
	}
	
	printf("%d",Ans);
	
	return 0;
}
